//? JavaScript函数柯里化是一种将多参数函数转化为一系列单参数函数的技术。
//? 通过函数柯里化，我们可以将一个接受多个参数的函数转换为一系列只接受单个参数的函数，这样可以更加灵活地组合和复用函数。

//? 多参函数add
function add(a, b, c) {
    return a + b + c;
}
//? curry 函数接受一个函数作为参数 并返回一个新的函数，该函数可以接受任意数量的参数，并将其转换为单个参数的形式
function curry(fn) {
    return function curried(...args) {
        //? 函数的length就是其参数的length
        if (args.length >= fn.length) {
            return fn.apply(this,args)
        }
        //? 如果传入参数不够 返回一个函数 这个函数的返回值又将调用curried
        else {
            return function (...args2) {
                //? 这里需要进行参数拼接，以满足参数不足的情况
                return curried.apply(this, args.concat(args2))
            }
        }
    }
}

const curriedAdd = curry(add)
console.log(curriedAdd(1,2)(3));
console.log(curriedAdd(1,2,3));
console.log(curriedAdd(1)(2)(3));
